ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಇಟರೇಟರ್ ಪ್ರೊಟೊಕಾಲ್ ಅನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳಲು ಮತ್ತು ಕಾರ್ಯಗತಗೊಳಿಸಲು ಒಂದು ಸಮಗ್ರ ಮಾರ್ಗದರ್ಶಿ. ಇದು ವರ್ಧಿತ ಡೇಟಾ ನಿರ್ವಹಣೆಗಾಗಿ ಕಸ್ಟಮ್ ಇಟರೇಟರ್ಗಳನ್ನು ರಚಿಸಲು ನಿಮಗೆ ಸಹಾಯ ಮಾಡುತ್ತದೆ.
ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಇಟರೇಟರ್ ಪ್ರೊಟೊಕಾಲ್ ಮತ್ತು ಕಸ್ಟಮ್ ಇಟರೇಟರ್ಗಳ ಸರಳೀಕರಣ
ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ನ ಇಟರೇಟರ್ ಪ್ರೊಟೊಕಾಲ್ ಡೇಟಾ ಸ್ಟ್ರಕ್ಚರ್ಗಳನ್ನು ಕ್ರಮಿಸಲು ಒಂದು ಪ್ರಮಾಣಿತ ಮಾರ್ಗವನ್ನು ಒದಗಿಸುತ್ತದೆ. ಈ ಪ್ರೊಟೊಕಾಲ್ ಅನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳುವುದರಿಂದ, ಡೆವಲಪರ್ಗಳು ಅರೇಗಳು ಮತ್ತು ಸ್ಟ್ರಿಂಗ್ಗಳಂತಹ ಅಂತರ್ನಿರ್ಮಿತ ಇಟರೇಬಲ್ಗಳೊಂದಿಗೆ ಸಮರ್ಥವಾಗಿ ಕೆಲಸ ಮಾಡಲು ಮತ್ತು ನಿರ್ದಿಷ್ಟ ಡೇಟಾ ಸ್ಟ್ರಕ್ಚರ್ಗಳು ಮತ್ತು ಅಪ್ಲಿಕೇಶನ್ ಅವಶ್ಯಕತೆಗಳಿಗೆ ಅನುಗುಣವಾಗಿ ತಮ್ಮದೇ ಆದ ಕಸ್ಟಮ್ ಇಟರೇಬಲ್ಗಳನ್ನು ರಚಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತದೆ. ಈ ಮಾರ್ಗದರ್ಶಿ ಇಟರೇಟರ್ ಪ್ರೊಟೊಕಾಲ್ ಮತ್ತು ಕಸ್ಟಮ್ ಇಟರೇಟರ್ಗಳನ್ನು ಹೇಗೆ ಕಾರ್ಯಗತಗೊಳಿಸುವುದು ಎಂಬುದರ ಬಗ್ಗೆ ಸಮಗ್ರ ವಿವರಣೆಯನ್ನು ಒದಗಿಸುತ್ತದೆ.
ಇಟರೇಟರ್ ಪ್ರೊಟೊಕಾಲ್ ಎಂದರೇನು?
ಇಟರೇಟರ್ ಪ್ರೊಟೊಕಾಲ್ ಒಂದು ಆಬ್ಜೆಕ್ಟ್ ಅನ್ನು ಹೇಗೆ ಇಟರೇಟ್ ಮಾಡಬಹುದು, ಅಂದರೆ, ಅದರ ಅಂಶಗಳನ್ನು ಅನುಕ್ರಮವಾಗಿ ಹೇಗೆ ಪ್ರವೇಶಿಸಬಹುದು ಎಂಬುದನ್ನು ವ್ಯಾಖ್ಯಾನಿಸುತ್ತದೆ. ಇದು ಎರಡು ಭಾಗಗಳನ್ನು ಒಳಗೊಂಡಿದೆ: ಇಟರೇಬಲ್ ಪ್ರೊಟೊಕಾಲ್ ಮತ್ತು ಇಟರೇಟರ್ ಪ್ರೊಟೊಕಾಲ್.
ಇಟರೇಬಲ್ ಪ್ರೊಟೊಕಾಲ್
ಒಂದು ಆಬ್ಜೆಕ್ಟ್ Symbol.iterator
ಕೀಲಿಯೊಂದಿಗೆ ಮೆಥಡ್ ಹೊಂದಿದ್ದರೆ ಅದನ್ನು ಇಟರೇಬಲ್ ಎಂದು ಪರಿಗಣಿಸಲಾಗುತ್ತದೆ. ಈ ಮೆಥಡ್ ಇಟರೇಟರ್ ಪ್ರೊಟೊಕಾಲ್ಗೆ ಅನುಗುಣವಾದ ಆಬ್ಜೆಕ್ಟ್ ಅನ್ನು ಹಿಂತಿರುಗಿಸಬೇಕು.
ಸಾರಾಂಶದಲ್ಲಿ, ಇಟರೇಬಲ್ ಆಬ್ಜೆಕ್ಟ್ ತನಗಾಗಿ ಒಂದು ಇಟರೇಟರ್ ಅನ್ನು ಹೇಗೆ ರಚಿಸಬೇಕೆಂದು ತಿಳಿದಿರುತ್ತದೆ.
ಇಟರೇಟರ್ ಪ್ರೊಟೊಕಾಲ್
ಇಟರೇಟರ್ ಪ್ರೊಟೊಕಾಲ್ ಒಂದು ಅನುಕ್ರಮದಿಂದ ಮೌಲ್ಯಗಳನ್ನು ಹೇಗೆ ಹಿಂಪಡೆಯುವುದು ಎಂಬುದನ್ನು ವ್ಯಾಖ್ಯಾನಿಸುತ್ತದೆ. ಒಂದು ಆಬ್ಜೆಕ್ಟ್ next()
ಮೆಥಡ್ ಹೊಂದಿದ್ದರೆ ಅದನ್ನು ಇಟರೇಟರ್ ಎಂದು ಪರಿಗಣಿಸಲಾಗುತ್ತದೆ, ಮತ್ತು ಈ ಮೆಥಡ್ ಎರಡು ಪ್ರಾಪರ್ಟಿಗಳನ್ನು ಹೊಂದಿರುವ ಆಬ್ಜೆಕ್ಟ್ ಅನ್ನು ಹಿಂತಿರುಗಿಸುತ್ತದೆ:
value
: ಅನುಕ್ರಮದಲ್ಲಿನ ಮುಂದಿನ ಮೌಲ್ಯ.done
: ಇಟರೇಟರ್ ಅನುಕ್ರಮದ ಅಂತ್ಯವನ್ನು ತಲುಪಿದೆಯೇ ಎಂದು ಸೂಚಿಸುವ ಬೂಲಿಯನ್ ಮೌಲ್ಯ.done
true
ಆಗಿದ್ದರೆ,value
ಪ್ರಾಪರ್ಟಿಯನ್ನು ಬಿಟ್ಟುಬಿಡಬಹುದು.
next()
ಮೆಥಡ್ ಇಟರೇಟರ್ ಪ್ರೊಟೊಕಾಲ್ನ ಪ್ರಮುಖ ಭಾಗವಾಗಿದೆ. next()
ಗೆ ಪ್ರತಿ ಕರೆಯು ಇಟರೇಟರ್ ಅನ್ನು ಮುಂದಕ್ಕೆ ಸರಿಸುತ್ತದೆ ಮತ್ತು ಅನುಕ್ರಮದಲ್ಲಿನ ಮುಂದಿನ ಮೌಲ್ಯವನ್ನು ಹಿಂತಿರುಗಿಸುತ್ತದೆ. ಎಲ್ಲಾ ಮೌಲ್ಯಗಳನ್ನು ಹಿಂತಿರುಗಿಸಿದಾಗ, next()
done
ಅನ್ನು true
ಗೆ ಹೊಂದಿಸಿ ಒಂದು ಆಬ್ಜೆಕ್ಟ್ ಅನ್ನು ಹಿಂತಿರುಗಿಸುತ್ತದೆ.
ಅಂತರ್ನಿರ್ಮಿತ ಇಟರೇಬಲ್ಗಳು
ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಹಲವಾರು ಅಂತರ್ನಿರ್ಮಿತ ಡೇಟಾ ಸ್ಟ್ರಕ್ಚರ್ಗಳನ್ನು ಒದಗಿಸುತ್ತದೆ, ಅವು ಸ್ವಾಭಾವಿಕವಾಗಿ ಇಟರೇಬಲ್ ಆಗಿರುತ್ತವೆ. ಇವುಗಳಲ್ಲಿ ಇವು ಸೇರಿವೆ:
- ಅರೇಗಳು
- ಸ್ಟ್ರಿಂಗ್ಗಳು
- ಮ್ಯಾಪ್ಗಳು
- ಸೆಟ್ಗಳು
- ಫಂಕ್ಷನ್ನ ಆರ್ಗ್ಯುಮೆಂಟ್ಸ್ ಆಬ್ಜೆಕ್ಟ್
- ಟೈಪ್ಡ್ಅರೇಗಳು
ಈ ಇಟರೇಬಲ್ಗಳನ್ನು for...of
ಲೂಪ್, ಸ್ಪ್ರೆಡ್ ಸಿಂಟ್ಯಾಕ್ಸ್ (...
), ಮತ್ತು ಇಟರೇಟರ್ ಪ್ರೊಟೊಕಾಲ್ ಅನ್ನು ಅವಲಂಬಿಸಿರುವ ಇತರ ರಚನೆಗಳೊಂದಿಗೆ ನೇರವಾಗಿ ಬಳಸಬಹುದು.
ಅರೇಗಳೊಂದಿಗೆ ಉದಾಹರಣೆ:
const myArray = ["apple", "banana", "cherry"];
for (const item of myArray) {
console.log(item); // Output: apple, banana, cherry
}
ಸ್ಟ್ರಿಂಗ್ಗಳೊಂದಿಗೆ ಉದಾಹರಣೆ:
const myString = "Hello";
for (const char of myString) {
console.log(char); // Output: H, e, l, l, o
}
for...of
ಲೂಪ್
for...of
ಲೂಪ್ ಇಟರೇಬಲ್ ಆಬ್ಜೆಕ್ಟ್ಗಳನ್ನು ಇಟರೇಟ್ ಮಾಡಲು ಒಂದು ಶಕ್ತಿಯುತ ರಚನೆಯಾಗಿದೆ. ಇದು ಇಟರೇಟರ್ ಪ್ರೊಟೊಕಾಲ್ನ ಸಂಕೀರ್ಣತೆಗಳನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ನಿರ್ವಹಿಸುತ್ತದೆ, ಇದರಿಂದಾಗಿ ಅನುಕ್ರಮದಲ್ಲಿನ ಮೌಲ್ಯಗಳನ್ನು ಪ್ರವೇಶಿಸುವುದು ಸುಲಭವಾಗುತ್ತದೆ.
for...of
ಲೂಪ್ನ ಸಿಂಟ್ಯಾಕ್ಸ್ ಹೀಗಿದೆ:
for (const element of iterable) {
// ಪ್ರತಿ ಎಲಿಮೆಂಟ್ಗಾಗಿ ಕಾರ್ಯಗತಗೊಳಿಸಬೇಕಾದ ಕೋಡ್
}
for...of
ಲೂಪ್ ಇಟರೇಬಲ್ ಆಬ್ಜೆಕ್ಟ್ನಿಂದ ಇಟರೇಟರ್ ಅನ್ನು (Symbol.iterator
ಬಳಸಿ) ಹಿಂಪಡೆಯುತ್ತದೆ, ಮತ್ತು ಇಟರೇಟರ್ನ next()
ಮೆಥಡ್ ಅನ್ನು done
true
ಆಗುವವರೆಗೆ ಪದೇ ಪದೇ ಕರೆಯುತ್ತದೆ. ಪ್ರತಿ ಇಟರೇಶನ್ನಲ್ಲಿ, next()
ನಿಂದ ಹಿಂತಿರುಗಿದ value
ಪ್ರಾಪರ್ಟಿಯನ್ನು element
ವೇರಿಯಬಲ್ಗೆ ನಿಗದಿಪಡಿಸಲಾಗುತ್ತದೆ.
ಕಸ್ಟಮ್ ಇಟರೇಟರ್ಗಳನ್ನು ರಚಿಸುವುದು
ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಅಂತರ್ನಿರ್ಮಿತ ಇಟರೇಬಲ್ಗಳನ್ನು ಒದಗಿಸುತ್ತದೆಯಾದರೂ, ಇಟರೇಟರ್ ಪ್ರೊಟೊಕಾಲ್ನ ನಿಜವಾದ ಶಕ್ತಿ ನಿಮ್ಮ ಸ್ವಂತ ಡೇಟಾ ಸ್ಟ್ರಕ್ಚರ್ಗಳಿಗಾಗಿ ಕಸ್ಟಮ್ ಇಟರೇಟರ್ಗಳನ್ನು ವ್ಯಾಖ್ಯಾನಿಸುವ ಸಾಮರ್ಥ್ಯದಲ್ಲಿದೆ. ಇದು ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಹೇಗೆ ಕ್ರಮಿಸಬೇಕು ಮತ್ತು ಪ್ರವೇಶಿಸಬೇಕು ಎಂಬುದನ್ನು ನಿಯಂತ್ರಿಸಲು ನಿಮಗೆ ಅನುಮತಿಸುತ್ತದೆ.
ಕಸ್ಟಮ್ ಇಟರೇಟರ್ ಅನ್ನು ಹೇಗೆ ರಚಿಸುವುದು ಎಂಬುದು ಇಲ್ಲಿದೆ:
- ನಿಮ್ಮ ಕಸ್ಟಮ್ ಡೇಟಾ ಸ್ಟ್ರಕ್ಚರ್ ಅನ್ನು ಪ್ರತಿನಿಧಿಸುವ ಕ್ಲಾಸ್ ಅಥವಾ ಆಬ್ಜೆಕ್ಟ್ ಅನ್ನು ವ್ಯಾಖ್ಯಾನಿಸಿ.
- ನಿಮ್ಮ ಕ್ಲಾಸ್ ಅಥವಾ ಆಬ್ಜೆಕ್ಟ್ನಲ್ಲಿ
Symbol.iterator
ಮೆಥಡ್ ಅನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸಿ. ಈ ಮೆಥಡ್ ಒಂದು ಇಟರೇಟರ್ ಆಬ್ಜೆಕ್ಟ್ ಅನ್ನು ಹಿಂತಿರುಗಿಸಬೇಕು. - ಇಟರೇಟರ್ ಆಬ್ಜೆಕ್ಟ್
value
ಮತ್ತುdone
ಪ್ರಾಪರ್ಟಿಗಳೊಂದಿಗೆ ಆಬ್ಜೆಕ್ಟ್ ಅನ್ನು ಹಿಂತಿರುಗಿಸುವnext()
ಮೆಥಡ್ ಅನ್ನು ಹೊಂದಿರಬೇಕು.
ಉದಾಹರಣೆ: ಸರಳ ಶ್ರೇಣಿಗಾಗಿ ಇಟರೇಟರ್ ರಚಿಸುವುದು
ಸಂಖ್ಯೆಗಳ ಶ್ರೇಣಿಯನ್ನು ಪ್ರತಿನಿಧಿಸುವ Range
ಎಂಬ ಕ್ಲಾಸ್ ಅನ್ನು ರಚಿಸೋಣ. ಶ್ರೇಣಿಯಲ್ಲಿನ ಸಂಖ್ಯೆಗಳ ಮೇಲೆ ಇಟರೇಟ್ ಮಾಡಲು ನಾವು ಇಟರೇಟರ್ ಪ್ರೊಟೊಕಾಲ್ ಅನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುತ್ತೇವೆ.
class Range {
constructor(start, end) {
this.start = start;
this.end = end;
}
[Symbol.iterator]() {
let currentValue = this.start;
const that = this; // ಇಟರೇಟರ್ ಆಬ್ಜೆಕ್ಟ್ ಒಳಗೆ ಬಳಸಲು 'this' ಅನ್ನು ಸೆರೆಹಿಡಿಯಿರಿ
return {
next() {
if (currentValue <= that.end) {
return {
value: currentValue++,
done: false,
};
} else {
return {
value: undefined,
done: true,
};
}
},
};
}
}
const myRange = new Range(1, 5);
for (const number of myRange) {
console.log(number); // Output: 1, 2, 3, 4, 5
}
ವಿವರಣೆ:
Range
ಕ್ಲಾಸ್ ತನ್ನ ಕನ್ಸ್ಟ್ರಕ್ಟರ್ನಲ್ಲಿstart
ಮತ್ತುend
ಮೌಲ್ಯಗಳನ್ನು ತೆಗೆದುಕೊಳ್ಳುತ್ತದೆ.Symbol.iterator
ಮೆಥಡ್ ಒಂದು ಇಟರೇಟರ್ ಆಬ್ಜೆಕ್ಟ್ ಅನ್ನು ಹಿಂತಿರುಗಿಸುತ್ತದೆ. ಈ ಇಟರೇಟರ್ ಆಬ್ಜೆಕ್ಟ್ ತನ್ನದೇ ಆದ ಸ್ಥಿತಿಯನ್ನು (currentValue
) ಮತ್ತುnext()
ಮೆಥಡ್ ಅನ್ನು ಹೊಂದಿರುತ್ತದೆ.next()
ಮೆಥಡ್currentValue
ಶ್ರೇಣಿಯಲ್ಲಿದೆಯೇ ಎಂದು ಪರಿಶೀಲಿಸುತ್ತದೆ. ಹಾಗಿದ್ದಲ್ಲಿ, ಅದು ಪ್ರಸ್ತುತ ಮೌಲ್ಯ ಮತ್ತುdone
ಅನ್ನುfalse
ಗೆ ಹೊಂದಿಸಿ ಒಂದು ಆಬ್ಜೆಕ್ಟ್ ಅನ್ನು ಹಿಂತಿರುಗಿಸುತ್ತದೆ. ಇದು ಮುಂದಿನ ಇಟರೇಶನ್ಗಾಗಿcurrentValue
ಅನ್ನು ಹೆಚ್ಚಿಸುತ್ತದೆ.currentValue
end
ಮೌಲ್ಯವನ್ನು ಮೀರಿದಾಗ,next()
ಮೆಥಡ್done
ಅನ್ನುtrue
ಗೆ ಹೊಂದಿಸಿ ಒಂದು ಆಬ್ಜೆಕ್ಟ್ ಅನ್ನು ಹಿಂತಿರುಗಿಸುತ್ತದೆ.that = this
ಬಳಕೆಯನ್ನು ಗಮನಿಸಿ.next()
ಮೆಥಡ್ ಅನ್ನು ಬೇರೆ ಸ್ಕೋಪ್ನಲ್ಲಿ (for...of
ಲೂಪ್ನಿಂದ) ಕರೆಯುವುದರಿಂದ,next()
ಒಳಗಿನthis
,Range
ಇನ್ಸ್ಟಾನ್ಸ್ ಅನ್ನು ಉಲ್ಲೇಖಿಸುವುದಿಲ್ಲ. ಇದನ್ನು ಪರಿಹರಿಸಲು, ನಾವುnext()
ಸ್ಕೋಪ್ನ ಹೊರಗೆthat
ನಲ್ಲಿthis
ಮೌಲ್ಯವನ್ನು (Range
ಇನ್ಸ್ಟಾನ್ಸ್) ಸೆರೆಹಿಡಿಯುತ್ತೇವೆ ಮತ್ತು ನಂತರnext()
ಒಳಗೆthat
ಅನ್ನು ಬಳಸುತ್ತೇವೆ.
ಉದಾಹರಣೆ: ಲಿಂಕ್ಡ್ ಲಿಸ್ಟ್ಗಾಗಿ ಇಟರೇಟರ್ ರಚಿಸುವುದು
ಮತ್ತೊಂದು ಉದಾಹರಣೆಯನ್ನು ಪರಿಗಣಿಸೋಣ: ಲಿಂಕ್ಡ್ ಲಿಸ್ಟ್ ಡೇಟಾ ಸ್ಟ್ರಕ್ಚರ್ಗಾಗಿ ಇಟರೇಟರ್ ರಚಿಸುವುದು. ಲಿಂಕ್ಡ್ ಲಿಸ್ಟ್ ನೋಡ್ಗಳ ಅನುಕ್ರಮವಾಗಿದೆ, ಅಲ್ಲಿ ಪ್ರತಿ ನೋಡ್ ಒಂದು ಮೌಲ್ಯ ಮತ್ತು ಪಟ್ಟಿಯಲ್ಲಿನ ಮುಂದಿನ ನೋಡ್ಗೆ ಒಂದು ಉಲ್ಲೇಖವನ್ನು (ಪಾಯಿಂಟರ್) ಹೊಂದಿರುತ್ತದೆ. ಪಟ್ಟಿಯಲ್ಲಿನ ಕೊನೆಯ ನೋಡ್ null (ಅಥವಾ undefined) ಗೆ ಉಲ್ಲೇಖವನ್ನು ಹೊಂದಿರುತ್ತದೆ.
class LinkedListNode {
constructor(value, next = null) {
this.value = value;
this.next = next;
}
}
class LinkedList {
constructor() {
this.head = null;
}
append(value) {
const newNode = new LinkedListNode(value);
if (!this.head) {
this.head = newNode;
return;
}
let current = this.head;
while (current.next) {
current = current.next;
}
current.next = newNode;
}
[Symbol.iterator]() {
let current = this.head;
return {
next() {
if (current) {
const value = current.value;
current = current.next;
return {
value: value,
done: false
};
} else {
return {
value: undefined,
done: true
};
}
}
};
}
}
// ಬಳಕೆಯ ಉದಾಹರಣೆ:
const myList = new LinkedList();
myList.append("London");
myList.append("Paris");
myList.append("Tokyo");
for (const city of myList) {
console.log(city); // Output: London, Paris, Tokyo
}
ವಿವರಣೆ:
LinkedListNode
ಕ್ಲಾಸ್ ಲಿಂಕ್ಡ್ ಲಿಸ್ಟ್ನಲ್ಲಿನ ಒಂದೇ ನೋಡ್ ಅನ್ನು ಪ್ರತಿನಿಧಿಸುತ್ತದೆ, ಇದು ಒಂದುvalue
ಮತ್ತು ಮುಂದಿನ ನೋಡ್ಗೆ ಒಂದು ಉಲ್ಲೇಖ (next
) ಅನ್ನು ಸಂಗ್ರಹಿಸುತ್ತದೆ.LinkedList
ಕ್ಲಾಸ್ ಲಿಂಕ್ಡ್ ಲಿಸ್ಟ್ ಅನ್ನು ಪ್ರತಿನಿಧಿಸುತ್ತದೆ. ಇದುhead
ಪ್ರಾಪರ್ಟಿಯನ್ನು ಹೊಂದಿದೆ, ಇದು ಪಟ್ಟಿಯಲ್ಲಿನ ಮೊದಲ ನೋಡ್ ಅನ್ನು ಸೂಚಿಸುತ್ತದೆ.append()
ಮೆಥಡ್ ಪಟ್ಟಿಯ ಕೊನೆಗೆ ಹೊಸ ನೋಡ್ಗಳನ್ನು ಸೇರಿಸುತ್ತದೆ.Symbol.iterator
ಮೆಥಡ್ ಒಂದು ಇಟರೇಟರ್ ಆಬ್ಜೆಕ್ಟ್ ಅನ್ನು ರಚಿಸಿ ಹಿಂತಿರುಗಿಸುತ್ತದೆ. ಈ ಇಟರೇಟರ್ ಪ್ರಸ್ತುತ ಭೇಟಿ ನೀಡುತ್ತಿರುವ ನೋಡ್ (current
) ಅನ್ನು ಟ್ರ್ಯಾಕ್ ಮಾಡುತ್ತದೆ.next()
ಮೆಥಡ್ ಪ್ರಸ್ತುತ ನೋಡ್ ಇದೆಯೇ ಎಂದು (current
null ಅಲ್ಲವೇ) ಪರಿಶೀಲಿಸುತ್ತದೆ. ಇದ್ದರೆ, ಅದು ಪ್ರಸ್ತುತ ನೋಡ್ನಿಂದ ಮೌಲ್ಯವನ್ನು ಹಿಂಪಡೆಯುತ್ತದೆ,current
ಪಾಯಿಂಟರ್ ಅನ್ನು ಮುಂದಿನ ನೋಡ್ಗೆ ಸರಿಸುತ್ತದೆ, ಮತ್ತು ಮೌಲ್ಯ ಹಾಗೂdone: false
ನೊಂದಿಗೆ ಆಬ್ಜೆಕ್ಟ್ ಅನ್ನು ಹಿಂತಿರುಗಿಸುತ್ತದೆ.current
null ಆದಾಗ (ಅಂದರೆ ನಾವು ಪಟ್ಟಿಯ ಅಂತ್ಯವನ್ನು ತಲುಪಿದ್ದೇವೆ),next()
ಮೆಥಡ್done: true
ನೊಂದಿಗೆ ಆಬ್ಜೆಕ್ಟ್ ಅನ್ನು ಹಿಂತಿರುಗಿಸುತ್ತದೆ.
ಜನರೇಟರ್ ಫಂಕ್ಷನ್ಗಳು
ಜನರೇಟರ್ ಫಂಕ್ಷನ್ಗಳು ಇಟರೇಟರ್ಗಳನ್ನು ರಚಿಸಲು ಹೆಚ್ಚು ಸಂಕ್ಷಿಪ್ತ ಮತ್ತು ಸೊಗಸಾದ ಮಾರ್ಗವನ್ನು ಒದಗಿಸುತ್ತವೆ. ಅವು ಬೇಡಿಕೆಯ ಮೇರೆಗೆ ಮೌಲ್ಯಗಳನ್ನು ಉತ್ಪಾದಿಸಲು yield
ಕೀವರ್ಡ್ ಅನ್ನು ಬಳಸುತ್ತವೆ.
ಜನರೇಟರ್ ಫಂಕ್ಷನ್ ಅನ್ನು function*
ಸಿಂಟ್ಯಾಕ್ಸ್ ಬಳಸಿ ವ್ಯಾಖ್ಯಾನಿಸಲಾಗುತ್ತದೆ.
ಉದಾಹರಣೆ: ಜನರೇಟರ್ ಫಂಕ್ಷನ್ ಬಳಸಿ ಇಟರೇಟರ್ ರಚಿಸುವುದು
Range
ಇಟರೇಟರ್ ಅನ್ನು ಜನರೇಟರ್ ಫಂಕ್ಷನ್ ಬಳಸಿ ಪುನಃ ಬರೆಯೋಣ:
class Range {
constructor(start, end) {
this.start = start;
this.end = end;
}
*[Symbol.iterator]() {
for (let i = this.start; i <= this.end; i++) {
yield i;
}
}
}
const myRange = new Range(1, 5);
for (const number of myRange) {
console.log(number); // Output: 1, 2, 3, 4, 5
}
ವಿವರಣೆ:
Symbol.iterator
ಮೆಥಡ್ ಈಗ ಒಂದು ಜನರೇಟರ್ ಫಂಕ್ಷನ್ ಆಗಿದೆ (*
ಅನ್ನು ಗಮನಿಸಿ).- ಜನರೇಟರ್ ಫಂಕ್ಷನ್ ಒಳಗೆ, ನಾವು ಸಂಖ್ಯೆಗಳ ಶ್ರೇಣಿಯ ಮೇಲೆ ಇಟರೇಟ್ ಮಾಡಲು
for
ಲೂಪ್ ಅನ್ನು ಬಳಸುತ್ತೇವೆ. yield
ಕೀವರ್ಡ್ ಜನರೇಟರ್ ಫಂಕ್ಷನ್ನ ಕಾರ್ಯಗತಗೊಳಿಸುವಿಕೆಯನ್ನು ವಿರಾಮಗೊಳಿಸುತ್ತದೆ ಮತ್ತು ಪ್ರಸ್ತುತ ಮೌಲ್ಯವನ್ನು (i
) ಹಿಂತಿರುಗಿಸುತ್ತದೆ. ಮುಂದಿನ ಬಾರಿ ಇಟರೇಟರ್ನnext()
ಮೆಥಡ್ ಅನ್ನು ಕರೆದಾಗ, ಕಾರ್ಯಗತಗೊಳಿಸುವಿಕೆಯು ನಿಲ್ಲಿಸಿದ ಸ್ಥಳದಿಂದ (yield
ಹೇಳಿಕೆಯ ನಂತರ) ಪುನರಾರಂಭಗೊಳ್ಳುತ್ತದೆ.- ಲೂಪ್ ಮುಗಿದಾಗ, ಜನರೇಟರ್ ಫಂಕ್ಷನ್ ಪರೋಕ್ಷವಾಗಿ
{ value: undefined, done: true }
ಅನ್ನು ಹಿಂತಿರುಗಿಸುತ್ತದೆ, ಇದು ಇಟರೇಶನ್ನ ಅಂತ್ಯವನ್ನು ಸೂಚಿಸುತ್ತದೆ.
ಜನರೇಟರ್ ಫಂಕ್ಷನ್ಗಳು next()
ಮೆಥಡ್ ಮತ್ತು done
ಫ್ಲ್ಯಾಗ್ ಅನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ನಿರ್ವಹಿಸುವ ಮೂಲಕ ಇಟರೇಟರ್ ರಚನೆಯನ್ನು ಸರಳಗೊಳಿಸುತ್ತವೆ.
ಉದಾಹರಣೆ: ಫಿಬೊನಾಕಿ ಸರಣಿ ಜನರೇಟರ್
ಜನರೇಟರ್ ಫಂಕ್ಷನ್ಗಳನ್ನು ಬಳಸುವುದಕ್ಕೆ ಮತ್ತೊಂದು ಉತ್ತಮ ಉದಾಹರಣೆಯೆಂದರೆ ಫಿಬೊನಾಕಿ ಸರಣಿಯನ್ನು ರಚಿಸುವುದು:
function* fibonacciSequence() {
let a = 0;
let b = 1;
while (true) {
yield a;
[a, b] = [b, a + b]; // ಏಕಕಾಲಿಕ ಅಪ್ಡೇಟ್ಗಾಗಿ ಡಿಸ್ಟ್ರಕ್ಚರಿಂಗ್ ಅಸೈನ್ಮೆಂಟ್
}
}
const fibonacci = fibonacciSequence();
for (let i = 0; i < 10; i++) {
console.log(fibonacci.next().value); // Output: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34
}
ವಿವರಣೆ:
fibonacciSequence
ಫಂಕ್ಷನ್ ಒಂದು ಜನರೇಟರ್ ಫಂಕ್ಷನ್ ಆಗಿದೆ.- ಇದು ಫಿಬೊನಾಕಿ ಸರಣಿಯ ಮೊದಲ ಎರಡು ಸಂಖ್ಯೆಗಳಿಗೆ (0 ಮತ್ತು 1)
a
ಮತ್ತುb
ಎಂಬ ಎರಡು ವೇರಿಯಬಲ್ಗಳನ್ನು ಪ್ರಾರಂಭಿಸುತ್ತದೆ. while (true)
ಲೂಪ್ ಅನಂತ ಅನುಕ್ರಮವನ್ನು ರಚಿಸುತ್ತದೆ.yield a
ಹೇಳಿಕೆಯುa
ನ ಪ್ರಸ್ತುತ ಮೌಲ್ಯವನ್ನು ಉತ್ಪಾದಿಸುತ್ತದೆ.[a, b] = [b, a + b]
ಹೇಳಿಕೆಯು ಡಿಸ್ಟ್ರಕ್ಚರಿಂಗ್ ಅಸೈನ್ಮೆಂಟ್ ಬಳಸಿ ಸರಣಿಯಲ್ಲಿನ ಮುಂದಿನ ಎರಡು ಸಂಖ್ಯೆಗಳಿಗೆa
ಮತ್ತುb
ಅನ್ನು ಏಕಕಾಲದಲ್ಲಿ ಅಪ್ಡೇಟ್ ಮಾಡುತ್ತದೆ.fibonacci.next().value
ಅಭಿವ್ಯಕ್ತಿ ಜನರೇಟರ್ನಿಂದ ಮುಂದಿನ ಮೌಲ್ಯವನ್ನು ಹಿಂಪಡೆಯುತ್ತದೆ. ಜನರೇಟರ್ ಅನಂತವಾಗಿರುವುದರಿಂದ, ಅದರಿಂದ ನೀವು ಎಷ್ಟು ಮೌಲ್ಯಗಳನ್ನು ಹೊರತೆಗೆಯುತ್ತೀರಿ ಎಂಬುದನ್ನು ನಿಯಂತ್ರಿಸಬೇಕು. ಈ ಉದಾಹರಣೆಯಲ್ಲಿ, ನಾವು ಮೊದಲ 10 ಮೌಲ್ಯಗಳನ್ನು ಹೊರತೆಗೆಯುತ್ತೇವೆ.
ಇಟರೇಟರ್ ಪ್ರೊಟೊಕಾಲ್ ಬಳಸುವುದರ ಪ್ರಯೋಜನಗಳು
- ಪ್ರಮಾಣೀಕರಣ: ಇಟರೇಟರ್ ಪ್ರೊಟೊಕಾಲ್ ವಿಭಿನ್ನ ಡೇಟಾ ಸ್ಟ್ರಕ್ಚರ್ಗಳ ಮೇಲೆ ಇಟರೇಟ್ ಮಾಡಲು ಸ್ಥಿರವಾದ ಮಾರ್ಗವನ್ನು ಒದಗಿಸುತ್ತದೆ.
- ನಮ್ಯತೆ: ನಿಮ್ಮ ನಿರ್ದಿಷ್ಟ ಅಗತ್ಯಗಳಿಗೆ ಅನುಗುಣವಾಗಿ ನೀವು ಕಸ್ಟಮ್ ಇಟರೇಟರ್ಗಳನ್ನು ವ್ಯಾಖ್ಯಾನಿಸಬಹುದು.
- ಓದಲು ಸುಲಭ:
for...of
ಲೂಪ್ ಇಟರೇಶನ್ ಕೋಡ್ ಅನ್ನು ಹೆಚ್ಚು ಓದಬಲ್ಲ ಮತ್ತು ಸಂಕ್ಷಿಪ್ತವಾಗಿಸುತ್ತದೆ. - ದಕ್ಷತೆ: ಇಟರೇಟರ್ಗಳು ಸೋಮಾರಿಯಾಗಿರಬಹುದು, ಅಂದರೆ ಅವು ಅಗತ್ಯವಿದ್ದಾಗ ಮಾತ್ರ ಮೌಲ್ಯಗಳನ್ನು ಉತ್ಪಾದಿಸುತ್ತವೆ, ಇದು ದೊಡ್ಡ ಡೇಟಾ ಸೆಟ್ಗಳಿಗೆ ಕಾರ್ಯಕ್ಷಮತೆಯನ್ನು ಸುಧಾರಿಸಬಹುದು. ಉದಾಹರಣೆಗೆ, ಮೇಲಿನ ಫಿಬೊನಾಕಿ ಸರಣಿ ಜನರೇಟರ್
next()
ಅನ್ನು ಕರೆದಾಗ ಮಾತ್ರ ಮುಂದಿನ ಮೌಲ್ಯವನ್ನು ಲೆಕ್ಕಾಚಾರ ಮಾಡುತ್ತದೆ. - ಹೊಂದಾಣಿಕೆ: ಇಟರೇಟರ್ಗಳು ಸ್ಪ್ರೆಡ್ ಸಿಂಟ್ಯಾಕ್ಸ್ ಮತ್ತು ಡಿಸ್ಟ್ರಕ್ಚರಿಂಗ್ನಂತಹ ಇತರ ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ವೈಶಿಷ್ಟ್ಯಗಳೊಂದಿಗೆ ಮನಬಂದಂತೆ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತವೆ.
ಸುಧಾರಿತ ಇಟರೇಟರ್ ತಂತ್ರಗಳು
ಇಟರೇಟರ್ಗಳನ್ನು ಸಂಯೋಜಿಸುವುದು
ನೀವು ಹಲವಾರು ಇಟರೇಟರ್ಗಳನ್ನು ಒಂದೇ ಇಟರೇಟರ್ ಆಗಿ ಸಂಯೋಜಿಸಬಹುದು. ನೀವು ಹಲವಾರು ಮೂಲಗಳಿಂದ ಡೇಟಾವನ್ನು ಏಕೀಕೃತ ರೀತಿಯಲ್ಲಿ ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಬೇಕಾದಾಗ ಇದು ಉಪಯುಕ್ತವಾಗಿದೆ.
function* combineIterators(...iterables) {
for (const iterable of iterables) {
for (const item of iterable) {
yield item;
}
}
}
const array1 = [1, 2, 3];
const array2 = ["a", "b", "c"];
const string1 = "XYZ";
const combined = combineIterators(array1, array2, string1);
for (const value of combined) {
console.log(value); // Output: 1, 2, 3, a, b, c, X, Y, Z
}
ಈ ಉದಾಹರಣೆಯಲ್ಲಿ, `combineIterators` ಫಂಕ್ಷನ್ ಯಾವುದೇ ಸಂಖ್ಯೆಯ ಇಟರೇಬಲ್ಗಳನ್ನು ಆರ್ಗ್ಯುಮೆಂಟ್ಗಳಾಗಿ ತೆಗೆದುಕೊಳ್ಳುತ್ತದೆ. ಇದು ಪ್ರತಿ ಇಟರೇಬಲ್ನ ಮೇಲೆ ಇಟರೇಟ್ ಮಾಡುತ್ತದೆ ಮತ್ತು ಪ್ರತಿ ಐಟಂ ಅನ್ನು ಯೀಲ್ಡ್ ಮಾಡುತ್ತದೆ. ಇದರ ಫಲಿತಾಂಶವು ಎಲ್ಲಾ ಇನ್ಪುಟ್ ಇಟರೇಬಲ್ಗಳಿಂದ ಎಲ್ಲಾ ಮೌಲ್ಯಗಳನ್ನು ಉತ್ಪಾದಿಸುವ ಒಂದೇ ಇಟರೇಟರ್ ಆಗಿದೆ.
ಇಟರೇಟರ್ಗಳನ್ನು ಫಿಲ್ಟರ್ ಮತ್ತು ಟ್ರಾನ್ಸ್ಫಾರ್ಮ್ ಮಾಡುವುದು
ಮತ್ತೊಂದು ಇಟರೇಟರ್ನಿಂದ ಉತ್ಪಾದಿಸಲಾದ ಮೌಲ್ಯಗಳನ್ನು ಫಿಲ್ಟರ್ ಮಾಡುವ ಅಥವಾ ಪರಿವರ್ತಿಸುವ ಇಟರೇಟರ್ಗಳನ್ನು ಸಹ ನೀವು ರಚಿಸಬಹುದು. ಇದು ಡೇಟಾವನ್ನು ಪೈಪ್ಲೈನ್ನಲ್ಲಿ ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಲು ನಿಮಗೆ ಅನುಮತಿಸುತ್ತದೆ, ಪ್ರತಿ ಮೌಲ್ಯವು ಉತ್ಪಾದನೆಯಾದಂತೆ ಅದಕ್ಕೆ ವಿಭಿನ್ನ ಕಾರ್ಯಾಚರಣೆಗಳನ್ನು ಅನ್ವಯಿಸುತ್ತದೆ.
function* filterIterator(iterable, predicate) {
for (const item of iterable) {
if (predicate(item)) {
yield item;
}
}
}
function* mapIterator(iterable, transform) {
for (const item of iterable) {
yield transform(item);
}
}
const numbers = [1, 2, 3, 4, 5, 6];
const evenNumbers = filterIterator(numbers, (x) => x % 2 === 0);
const squaredEvenNumbers = mapIterator(evenNumbers, (x) => x * x);
for (const value of squaredEvenNumbers) {
console.log(value); // Output: 4, 16, 36
}
ಇಲ್ಲಿ, `filterIterator` ಒಂದು ಇಟರೇಬಲ್ ಮತ್ತು ಒಂದು ಪ್ರೆಡಿಕೇಟ್ ಫಂಕ್ಷನ್ ಅನ್ನು ತೆಗೆದುಕೊಳ್ಳುತ್ತದೆ. ಪ್ರೆಡಿಕೇಟ್ `true` ಅನ್ನು ಹಿಂತಿರುಗಿಸುವ ಐಟಂಗಳನ್ನು ಮಾತ್ರ ಇದು ಯೀಲ್ಡ್ ಮಾಡುತ್ತದೆ. `mapIterator` ಒಂದು ಇಟರೇಬಲ್ ಮತ್ತು ಒಂದು ಟ್ರಾನ್ಸ್ಫಾರ್ಮ್ ಫಂಕ್ಷನ್ ಅನ್ನು ತೆಗೆದುಕೊಳ್ಳುತ್ತದೆ. ಇದು ಪ್ರತಿ ಐಟಂಗೆ ಟ್ರಾನ್ಸ್ಫಾರ್ಮ್ ಫಂಕ್ಷನ್ ಅನ್ನು ಅನ್ವಯಿಸಿದ ಫಲಿತಾಂಶವನ್ನು ಯೀಲ್ಡ್ ಮಾಡುತ್ತದೆ.
ನೈಜ-ಪ್ರಪಂಚದ ಅಪ್ಲಿಕೇಶನ್ಗಳು
ಇಟರೇಟರ್ ಪ್ರೊಟೊಕಾಲ್ ಅನ್ನು ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಲೈಬ್ರರಿಗಳು ಮತ್ತು ಫ್ರೇಮ್ವರ್ಕ್ಗಳಲ್ಲಿ ವ್ಯಾಪಕವಾಗಿ ಬಳಸಲಾಗುತ್ತದೆ, ಮತ್ತು ಇದು ವಿವಿಧ ನೈಜ-ಪ್ರಪಂಚದ ಅಪ್ಲಿಕೇಶನ್ಗಳಲ್ಲಿ, ವಿಶೇಷವಾಗಿ ದೊಡ್ಡ ಡೇಟಾಸೆಟ್ಗಳು ಅಥವಾ ಅಸಿಂಕ್ರೋನಸ್ ಕಾರ್ಯಾಚರಣೆಗಳೊಂದಿಗೆ ವ್ಯವಹರಿಸುವಾಗ ಮೌಲ್ಯಯುತವಾಗಿದೆ.
- ಡೇಟಾ ಸಂಸ್ಕರಣೆ: ದೊಡ್ಡ ಡೇಟಾಸೆಟ್ಗಳನ್ನು ದಕ್ಷವಾಗಿ ಸಂಸ್ಕರಿಸಲು ಇಟರೇಟರ್ಗಳು ಉಪಯುಕ್ತವಾಗಿವೆ, ಏಕೆಂದರೆ ಅವು ಸಂಪೂರ್ಣ ಡೇಟಾಸೆಟ್ ಅನ್ನು ಮೆಮೊರಿಗೆ ಲೋಡ್ ಮಾಡದೆಯೇ ಡೇಟಾವನ್ನು ತುಣುಕುಗಳಲ್ಲಿ ಕೆಲಸ ಮಾಡಲು ನಿಮಗೆ ಅನುಮತಿಸುತ್ತವೆ. ಗ್ರಾಹಕರ ಡೇಟಾವನ್ನು ಒಳಗೊಂಡಿರುವ ದೊಡ್ಡ CSV ಫೈಲ್ ಅನ್ನು ಪಾರ್ಸ್ ಮಾಡುವುದನ್ನು ಕಲ್ಪಿಸಿಕೊಳ್ಳಿ. ಇಡೀ ಫೈಲ್ ಅನ್ನು ಒಂದೇ ಬಾರಿಗೆ ಮೆಮೊರಿಗೆ ಲೋಡ್ ಮಾಡದೆಯೇ ಪ್ರತಿ ಸಾಲನ್ನು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಲು ಇಟರೇಟರ್ ನಿಮಗೆ ಅನುಮತಿಸುತ್ತದೆ.
- ಅಸಿಂಕ್ರೋನಸ್ ಕಾರ್ಯಾಚರಣೆಗಳು: API ನಿಂದ ಡೇಟಾವನ್ನು ತರುವಂತಹ ಅಸಿಂಕ್ರೋನಸ್ ಕಾರ್ಯಾಚರಣೆಗಳನ್ನು ನಿರ್ವಹಿಸಲು ಇಟರೇಟರ್ಗಳನ್ನು ಬಳಸಬಹುದು. ಡೇಟಾ ಲಭ್ಯವಾಗುವವರೆಗೆ ಕಾರ್ಯಗತಗೊಳಿಸುವಿಕೆಯನ್ನು ವಿರಾಮಗೊಳಿಸಲು ಮತ್ತು ನಂತರ ಮುಂದಿನ ಮೌಲ್ಯದೊಂದಿಗೆ ಪುನರಾರಂಭಿಸಲು ನೀವು ಜನರೇಟರ್ ಫಂಕ್ಷನ್ಗಳನ್ನು ಬಳಸಬಹುದು.
- ಕಸ್ಟಮ್ ಡೇಟಾ ಸ್ಟ್ರಕ್ಚರ್ಗಳು: ನಿರ್ದಿಷ್ಟ ಕ್ರಮದ ಅವಶ್ಯಕತೆಗಳೊಂದಿಗೆ ಕಸ್ಟಮ್ ಡೇಟಾ ಸ್ಟ್ರಕ್ಚರ್ಗಳನ್ನು ರಚಿಸಲು ಇಟರೇಟರ್ಗಳು ಅತ್ಯಗತ್ಯ. ಟ್ರೀ ಡೇಟಾ ಸ್ಟ್ರಕ್ಚರ್ ಅನ್ನು ಪರಿಗಣಿಸಿ. ಟ್ರೀಯನ್ನು ನಿರ್ದಿಷ್ಟ ಕ್ರಮದಲ್ಲಿ (ಉದಾಹರಣೆಗೆ, ಡೆಪ್ತ್-ಫಸ್ಟ್ ಅಥವಾ ಬ್ರೆಡ್ತ್-ಫಸ್ಟ್) ಕ್ರಮಿಸಲು ನೀವು ಕಸ್ಟಮ್ ಇಟರೇಟರ್ ಅನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸಬಹುದು.
- ಗೇಮ್ ಅಭಿವೃದ್ಧಿ: ಗೇಮ್ ಅಭಿವೃದ್ಧಿಯಲ್ಲಿ, ಗೇಮ್ ಆಬ್ಜೆಕ್ಟ್ಗಳು, ಪಾರ್ಟಿಕಲ್ ಎಫೆಕ್ಟ್ಗಳು ಮತ್ತು ಇತರ ಡೈನಾಮಿಕ್ ಅಂಶಗಳನ್ನು ನಿರ್ವಹಿಸಲು ಇಟರೇಟರ್ಗಳನ್ನು ಬಳಸಬಹುದು.
- ಬಳಕೆದಾರ ಇಂಟರ್ಫೇಸ್ ಲೈಬ್ರರಿಗಳು: ಅನೇಕ UI ಲೈಬ್ರರಿಗಳು ಆಧಾರವಾಗಿರುವ ಡೇಟಾ ಬದಲಾವಣೆಗಳ ಆಧಾರದ ಮೇಲೆ ಕಾಂಪೊನೆಂಟ್ಗಳನ್ನು ದಕ್ಷವಾಗಿ ಅಪ್ಡೇಟ್ ಮಾಡಲು ಮತ್ತು ರೆಂಡರ್ ಮಾಡಲು ಇಟರೇಟರ್ಗಳನ್ನು ಬಳಸುತ್ತವೆ.
ಉತ್ತಮ ಅಭ್ಯಾಸಗಳು
Symbol.iterator
ಅನ್ನು ಸರಿಯಾಗಿ ಕಾರ್ಯಗತಗೊಳಿಸಿ: ನಿಮ್ಮSymbol.iterator
ಮೆಥಡ್ ಇಟರೇಟರ್ ಪ್ರೊಟೊಕಾಲ್ಗೆ ಅನುಗುಣವಾದ ಇಟರೇಟರ್ ಆಬ್ಜೆಕ್ಟ್ ಅನ್ನು ಹಿಂತಿರುಗಿಸುತ್ತದೆ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ.done
ಫ್ಲ್ಯಾಗ್ ಅನ್ನು ನಿಖರವಾಗಿ ನಿರ್ವಹಿಸಿ: ಇಟರೇಶನ್ನ ಅಂತ್ಯವನ್ನು ಸೂಚಿಸಲುdone
ಫ್ಲ್ಯಾಗ್ ನಿರ್ಣಾಯಕವಾಗಿದೆ. ನಿಮ್ಮnext()
ಮೆಥಡ್ನಲ್ಲಿ ಅದನ್ನು ಸರಿಯಾಗಿ ಹೊಂದಿಸಲು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ.- ಜನರೇಟರ್ ಫಂಕ್ಷನ್ಗಳನ್ನು ಬಳಸುವುದನ್ನು ಪರಿಗಣಿಸಿ: ಜನರೇಟರ್ ಫಂಕ್ಷನ್ಗಳು ಇಟರೇಟರ್ಗಳನ್ನು ರಚಿಸಲು ಹೆಚ್ಚು ಸಂಕ್ಷಿಪ್ತ ಮತ್ತು ಓದಬಲ್ಲ ಮಾರ್ಗವನ್ನು ಒದಗಿಸುತ್ತವೆ.
next()
ನಲ್ಲಿ ಅಡ್ಡಪರಿಣಾಮಗಳನ್ನು ತಪ್ಪಿಸಿ:next()
ಮೆಥಡ್ ಪ್ರಾಥಮಿಕವಾಗಿ ಮುಂದಿನ ಮೌಲ್ಯವನ್ನು ಹಿಂಪಡೆಯುವುದು ಮತ್ತು ಇಟರೇಟರ್ನ ಸ್ಥಿತಿಯನ್ನು ನವೀಕರಿಸುವುದರ ಮೇಲೆ ಗಮನಹರಿಸಬೇಕು.next()
ಒಳಗೆ ಸಂಕೀರ್ಣ ಕಾರ್ಯಾಚರಣೆಗಳನ್ನು ಅಥವಾ ಅಡ್ಡಪರಿಣಾಮಗಳನ್ನು ಮಾಡುವುದನ್ನು ತಪ್ಪಿಸಿ.- ನಿಮ್ಮ ಇಟರೇಟರ್ಗಳನ್ನು ಸಂಪೂರ್ಣವಾಗಿ ಪರೀಕ್ಷಿಸಿ: ನಿಮ್ಮ ಕಸ್ಟಮ್ ಇಟರೇಟರ್ಗಳು ಸರಿಯಾಗಿ ವರ್ತಿಸುತ್ತವೆಯೇ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಲು ವಿವಿಧ ಡೇಟಾ ಸೆಟ್ಗಳು ಮತ್ತು ಸನ್ನಿವೇಶಗಳೊಂದಿಗೆ ಪರೀಕ್ಷಿಸಿ.
ತೀರ್ಮಾನ
ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಇಟರೇಟರ್ ಪ್ರೊಟೊಕಾಲ್ ಡೇಟಾ ಸ್ಟ್ರಕ್ಚರ್ಗಳನ್ನು ಕ್ರಮಿಸಲು ಶಕ್ತಿಯುತ ಮತ್ತು ನಮ್ಯವಾದ ಮಾರ್ಗವನ್ನು ಒದಗಿಸುತ್ತದೆ. ಇಟರೇಬಲ್ ಮತ್ತು ಇಟರೇಟರ್ ಪ್ರೊಟೊಕಾಲ್ಗಳನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳುವ ಮೂಲಕ, ಮತ್ತು ಜನರೇಟರ್ ಫಂಕ್ಷನ್ಗಳನ್ನು ಬಳಸಿಕೊಳ್ಳುವ ಮೂಲಕ, ನಿಮ್ಮ ನಿರ್ದಿಷ್ಟ ಅಗತ್ಯಗಳಿಗೆ ಅನುಗುಣವಾಗಿ ನೀವು ಕಸ್ಟಮ್ ಇಟರೇಟರ್ಗಳನ್ನು ರಚಿಸಬಹುದು. ಇದು ನಿಮಗೆ ಡೇಟಾದೊಂದಿಗೆ ದಕ್ಷವಾಗಿ ಕೆಲಸ ಮಾಡಲು, ಕೋಡ್ ಓದುವಿಕೆಯನ್ನು ಸುಧಾರಿಸಲು ಮತ್ತು ನಿಮ್ಮ ಅಪ್ಲಿಕೇಶನ್ಗಳ ಕಾರ್ಯಕ್ಷಮತೆಯನ್ನು ಹೆಚ್ಚಿಸಲು ಅನುವು ಮಾಡಿಕೊಡುತ್ತದೆ. ಇಟರೇಟರ್ಗಳನ್ನು ಕರಗತ ಮಾಡಿಕೊಳ್ಳುವುದು ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ನ ಸಾಮರ್ಥ್ಯಗಳ ಬಗ್ಗೆ ಆಳವಾದ ತಿಳುವಳಿಕೆಯನ್ನು ನೀಡುತ್ತದೆ ಮತ್ತು ಹೆಚ್ಚು ಸೊಗಸಾದ ಮತ್ತು ದಕ್ಷ ಕೋಡ್ ಬರೆಯಲು ನಿಮಗೆ ಅಧಿಕಾರ ನೀಡುತ್ತದೆ.